home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / scope / 001-025 / scopedisk19 / blinker / basiclinker.exe < prev    next >
Text File  |  1995-03-18  |  4KB  |  150 lines

  1.   DIM ModulesUsed$(40)
  2.   DIM SHARED TRUE,FALSE,NoError
  3.   TRUE = -1
  4.   FALSE = 0
  5.   ON ERROR GOTO ProcessError
  6.   NoError = TRUE
  7.   CALL GetLinkerInfo.SUB(ProgramName$,LibraryPathname$,ProgramPathname$,Compress)
  8.    OPEN ProgramPathname$+ProgramName$+".EXE" FOR OUTPUT AS #2  LEN = 4096
  9.    IF NoError THEN
  10.       CALL LinkModules.SUB(ProgramName$,ModulesUsed$(),Used,ProgramCreated)
  11.       IF ProgramCreated THEN
  12.          PRINT "Link Complete - Program saved as ";ProgramName$;".EXE"
  13.       ELSE
  14.          PRINT "Link Failed"
  15.       END IF
  16.    ELSE
  17.       PRINT "Unable to open output file - Link Failed"
  18.    END IF
  19.    CLOSE 2
  20.    END
  21. ProcessError:
  22.   IF ERR = 53 OR ERR = 61 OR ERR = 64 OR ERR = 68 OR ERR = 70 THEN
  23.     NoError = FALSE
  24.     IF ERR = 70 THEN
  25.       PRINT "Disk write-protected!"
  26.     ELSEIF ERR = 61 THEN
  27.       PRINT "Disk FULL!"
  28.     ELSE
  29.       PRINT "Unable to access file."
  30.     END IF
  31.     RESUME NEXT
  32.   ELSE
  33.     ON ERROR GOTO 0
  34.   END IF
  35.   SUB GetLinkerInfo.SUB(ProgramName$,LibPath$,PrgPath$,Compress) STATIC
  36.   ProgramName$ = ""
  37.   WHILE ProgramName$ = ""
  38.     INPUT "Program name";ProgramName$
  39.   WEND
  40.   INPUT "Library pathname";LibPath$
  41.   IF LEN(LibPath$) > 4 AND RIGHT$(LibPath$,1) <> "/" THEN
  42.     LibPath$ = LibPath$ + "/"
  43.   END IF
  44.   INPUT "Program pathname";PrgPath$
  45.   IF LEN(PrgPath$) > 4 AND RIGHT$(PrgPath$,1) <> "/" THEN
  46.     PrgPath$ = PrgPath$ + "/"
  47.   END IF
  48.   INPUT "Compress (Y or N)";Answer$
  49.    IF UCASE$(Answer$) = "Y" THEN
  50.      Compress = TRUE
  51.    ELSE
  52.      Compress = FALSE
  53.    END IF
  54.   END SUB
  55.   SUB LinkModules.SUB(ProgramName$,ModulesUsed$(1),Used,BuildComplete) STATIC
  56.   DIM ModulesCalled$(40)
  57.   BuildComplete = FALSE
  58.   Used = 1
  59.   Scanned = 0
  60.   ModulesUsed$(Used) = ProgramName$
  61.   RepeatUntil = TRUE
  62.   WHILE RepeatUntil
  63.     ModuleName$ = ModulesUsed$(Scanned + 1)
  64.     CALL ScanModule.SUB(ModuleName$,ModulesCalled$(),Called,ModuleScanned)
  65.      IF Called > 0 THEN
  66.       FOR x = 1 TO Called
  67.         IsNotIn = TRUE
  68.         FOR y = 1 TO Used
  69.           IF UCASE$(ModulesCalled$(x)) = UCASE$(ModulesUsed$(y)) THEN IsNotIn = FALSE
  70.         NEXT y
  71.          IF IsNotIn THEN
  72.           Used = Used + 1
  73.           ModulesUsed$(Used) = ModulesCalled$(x)
  74.         END IF
  75.       NEXT x
  76.     END IF
  77.     Scanned = Scanned + 1
  78.     IF (Used = Scanned) OR (NOT ModuleScanned) THEN RepeatUntil = FALSE
  79.   WEND
  80.   BuildComplete = ModuleScanned
  81.   END SUB
  82.   SUB ScanModule.SUB(ModuleName$,ModulesCalled$(1),Called,ModuleScanned) STATIC
  83.   SHARED LibraryPathname$,Compress
  84.   Called = 0
  85.   PRINT "Scanning module ";ModuleName$
  86.   OPEN LibraryPathname$+ModuleName$ FOR INPUT AS #1 LEN = 4096
  87.   IF NoError THEN
  88.     WHILE NoError AND (NOT EOF(1))
  89.       LINE INPUT#1,SourceLine$
  90.       CALL CommentCheck.SUB(SourceLine$,LineIsComment)
  91.       IF NOT (LineIsComment AND Compress) THEN
  92.          PRINT #2,SourceLine$
  93.       END IF
  94.       IF NOT LineIsComment THEN
  95.          CALL ScanLine.SUB(SourceLine$,ModuleCall$)
  96.          IF ModuleCall$ <> "" THEN
  97.             Called = Called + 1
  98.             ModulesCalled$(Called) = ModuleCall$
  99.          END IF
  100.       END IF
  101.     WEND
  102.   END IF
  103.   IF NoError THEN
  104.     ModuleScanned = TRUE
  105.   ELSE
  106.     ModuleScanned = FALSE
  107.   END IF
  108.   CLOSE #1
  109.   END SUB
  110.   SUB CommentCheck.SUB(SourceLine$,LineIsComment) STATIC
  111.   LineIsComment = FALSE
  112.   Uline$ = UCASE$(SourceLine$)
  113.   CharPos = 1
  114.   Nonblank = FALSE
  115.   WHILE (NOT Nonblank) AND CharPos <= LEN(Uline$)
  116.     IF MID$(Uline$,CharPos,1) <> " " THEN
  117.       Nonblank = TRUE
  118.     ELSE
  119.       CharPos = CharPos + 1
  120.     END IF
  121.   WEND
  122.   IF Nonblank THEN
  123.     IF MID$(Uline$,CharPos,1) = "'" OR MID$(Uline$,CharPos,3) = "REM" THEN
  124.       LineIsComment = TRUE
  125.     END IF
  126.   ELSE
  127.     LineIsComment = TRUE
  128.   END IF
  129.   END SUB
  130.  SUB ScanLine.SUB(SourceLine$,ModuleCall$) STATIC
  131.   ModuleCall$ = ""
  132.   ThisLine$ = " " + SourceLine$
  133.     CALL CommentCheck.SUB(ThisLine$,LineIsComment)
  134.     IF NOT LineIsComment THEN
  135.       C = INSTR(UCASE$(ThisLine$)," CALL ")
  136.       IF C > 0 THEN
  137.          Character = C + 6
  138.          WHILE MID$(ThisLine$,Character,1) = " "
  139.            Character = Character + 1
  140.          WEND
  141.          C = Character
  142.          C = INSTR(C,UCASE$(ThisLine$),".SUB")
  143.          IF C > 0 THEN
  144.             Length = (C + 4) - Character
  145.             ModuleCall$ = MID$(ThisLine$,Character,Length)
  146.          END IF
  147.       END IF
  148.    END IF  
  149. END SUB
  150.